﻿using FlyingCircusWebIS.Controllers.Utilidades;
using FlyingCircusWebIS.Filtros;
using FlyingCircusWebIS.Models;
using FlyingCircusWebIS.ViewModels.CidadeVM;
using System;
using System.Collections.Generic;
using System.Data.OleDb;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using PagedList;

namespace FlyingCircusWebIS.Controllers
{
    [AutenticacaoFilter("A")]
    public class CidadeController : Controller
    {

        private CidadeService cidadeService;

        public CidadeController()
        {
            cidadeService = new CidadeService();
        }


        public ActionResult Index(int pagina = 1, string nomeCidade = "")
        {
            CidadeIndexVM vm = ConstruirIndexVM(pagina, nomeCidade);
            return View(vm);
        }


        public ActionResult Form(int? id)
        {
            CidadeFormVM vm;
            if (id.HasValue)
            {
                vm = ConstruirFormVMParaEdicao(id.Value);
                if (vm == null)
                    return new HttpNotFoundResult();
            }
            else
            {
                vm = ConstruirFormVMParaNovo();
            }

            return View(vm);
        }


        [HttpPost]
        public ActionResult Form(CidadeFormVM vm)
        {
            if (ModelState.IsValid)
            {
                Cidade registro = ConverterFormVM(vm);

                var erros = cidadeService.ValidarEntidade(registro);
                if (erros.Count == 0)
                {
                    if (vm.Edicao)
                        cidadeService.Atualizar(registro);
                    else
                        cidadeService.Adicionar(registro);

                    return RedirectToAction("Index");
                }
                else
                {
                    ModelState.AddModelErrors(erros);
                }
            }


            vm.ItensUF = cidadeService.ListarItensUF();
            return View(vm);
        }


        public JsonResult Remover(int id)
        {
            JsonActionResultModel jarm = new JsonActionResultModel();

            var erros = cidadeService.ValidaRemoverPorId(id);
            if (erros.Count == 0)
            {
                cidadeService.RemoverPorId(id);
                jarm.Erro = false;
                jarm.Mensagem = "Registro removido com sucesso!";
            }
            else
            {
                jarm.Erro = true;
                jarm.Mensagem = "Não é possível remover o registro.\n";
                jarm.AddValidationResultErros(erros);
            }

            return Json(jarm);
        }



        // -----------------------------------------------------------------------------------------
        // Métodos auxiliares 
        // -----------------------------------------------------------------------------------------


        private CidadeIndexVM ConstruirIndexVM(int pagina, string nomeCidade)
        {
            CidadeIndexVM vm = new CidadeIndexVM();

            IPagedList<Cidade> registros = cidadeService.Listar().FindAll(
                    c => c.NomeCidade.StartsWith(nomeCidade, 
                          StringComparison.InvariantCultureIgnoreCase)).ToPagedList(pagina, 10);
            int totalRegistros = registros.Count;

            vm.Registros = registros;
            vm.TotalRegistros = totalRegistros;
            vm.NomeCidade = nomeCidade;
            return vm;
        }

        private Cidade ConverterFormVM(CidadeFormVM vm)
        {
            Cidade registro = new Cidade();
            registro.IdCidade = vm.IdCidade;
            registro.NomeCidade = vm.NomeCidade;
            registro.UF = vm.UF;

            return registro;
        }

        private CidadeFormVM ConverterFormVM(Cidade registro)
        {
            CidadeFormVM vm = new CidadeFormVM();
            vm.IdCidade = registro.IdCidade;
            vm.NomeCidade = registro.NomeCidade;
            vm.UF = registro.UF;

            return vm;
        }

        private CidadeFormVM ConstruirFormVMParaEdicao(int id)
        {
            Cidade registro = cidadeService.BuscarPorId(id);
            if (registro != null)
            {
                CidadeFormVM vm = ConverterFormVM(registro);
                vm.Edicao = true;
                vm.ItensUF = cidadeService.ListarItensUF();

                return vm;
            }

            return null;
            
        }

        private CidadeFormVM ConstruirFormVMParaNovo()
        {
            CidadeFormVM vm = new CidadeFormVM();
            vm.Edicao = false;
            vm.ItensUF = cidadeService.ListarItensUF();

            return vm;
        }


    }
}
